package chapter02

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"net/http"
)

type UserInfo struct { //定义一个UserInfo结构体
	Id   int    `form:"id"`
	Name string `form:"name"`
	Age  int    `form:"age"`
	Addr string `form:"addr"`
}

func User(ctx *gin.Context) {
	name := "Alex"
	ctx.HTML(200, "user.html", name)
}

// UserInfoStruct 对UserInfo结构体进行渲染
func UserInfoStruct(ctx *gin.Context) {
	//结构体初始化方式一
	//user_info := UserInfo{Id: 001, Name: "Alex", Age: 19, Addr: "北京"} //UserInfo结构体初始化

	//结构体初始化方式二
	var user_info1 UserInfo
	user_info1.Id = 2
	user_info1.Name = "Cindy"
	user_info1.Age = 20
	user_info1.Addr = "南京"
	ctx.HTML(http.StatusOK, "user_info.html", user_info1)

	//ctx.HTML(http.StatusOK, "user_info.html", user_info) //加载前端页面user_info.html，注意最后一个参数
}

// ArrController 后端传数组到前端
func ArrController(ctx *gin.Context) {

	arr := [3]int{1, 3, 4}
	ctx.HTML(http.StatusOK, "arr.html", arr)
}
func ArrStruct(ctx *gin.Context) {

	arr_struct := [3]UserInfo{{Id: 001, Name: "赵丽", Age: 21}, {Id: 002, Name: "小王", Age: 25}, {Id: 003, Name: "小张", Age: 28}}
	ctx.HTML(http.StatusOK, "arr_struct.html", arr_struct)
}

// MapController 后端传map到前端
func MapController(ctx *gin.Context) {
	map_data := map[string]string{"name": "张三", "age": "25"}
	map_data2 := map[string]int{"age": 21}

	map_data3 := map[string]interface{}{"map_data": map_data, "map_data2": map_data2}
	ctx.HTML(http.StatusOK, "map.html", map_data3)
}

// MapStruct 后端传map_struct到前端
func MapStruct(ctx *gin.Context) {
	map_struct := map[string]UserInfo{"User": {Id: 001, Name: "李四", Age: 23, Addr: "北京"}}
	ctx.HTML(http.StatusOK, "map_struct.html", map_struct)
}

// Slice 后端传切片到前端
func Slice(ctx *gin.Context) {

	slice_data := []string{"golang", "Python", "Java"}
	ctx.HTML(http.StatusOK, "slice_data.html", slice_data)
}

// Param1 前端传数据到后端-param
func Param1(ctx *gin.Context) {
	id := ctx.Param("id")
	ctx.String(http.StatusOK, "Hello，%s", id)
}
func Param2(ctx *gin.Context) {
	id := ctx.Param("id") //param返回url上的参数值，即":"后面的值
	ctx.String(http.StatusOK, "Hello，%s", id)
}

// GetQueryDate 前端传数据到后端-query&DefaultQuery
func GetQueryDate(ctx *gin.Context) {
	id := ctx.Query("id") //query查询url上指定的id值，如果存在则返回id后面的值，否则返回空字符串

	name := ctx.DefaultQuery("name", "张三") //DefaultQuery查询url上指定的name值，如果存在则返回name的值，否则返回第二个参数初始化的值
	fmt.Println(name)
	ctx.String(http.StatusOK, "alex %s", id)
}

// GetQueryArrDate 前端传数据到后端-QueryArr&QueryMap
func GetQueryArrDate(ctx *gin.Context) {
	ids := ctx.QueryArray("ids") //QueryArr查询url上指定的ids的值，如果存在则将"ids="后面的值转换成一个数组并返回，如果不存在则返回空数组。(实际上返回的是切片[]string)
	// http://localhost:8080/query_arr?ids=小李，12，,1,3      返回[小李，12，,1,3]
	ctx.String(http.StatusOK, "%s", ids)
}
func GetQueryMapDate(ctx *gin.Context) {
	user := ctx.QueryMap("user") //将user后面的k-v结构返回成map
	// http://localhost:8080/query_map?useruser[name]=张三&user[age]=22   返回map[age:22 name:张三]   tips：map输出是无序的
	ctx.String(http.StatusOK, "%s", user)
}

func ToUserAdd(ctx *gin.Context) {
	ctx.HTML(200, "to_user_add.html", nil)
}
func DoUserAdd(ctx *gin.Context) {
	username := ctx.PostForm("username")
	password := ctx.PostForm("password")
	fmt.Println(username, password)
	ctx.String(http.StatusOK, "添加成功")
}

func ToUserAdd2(ctx *gin.Context) {
	ctx.HTML(200, "to_user_add2.html", nil)
}
func DoUserAdd2(ctx *gin.Context) {
	username := ctx.PostForm("username")
	password := ctx.PostForm("password")    //前端直接传字符串类型参数
	age := ctx.DefaultPostForm("age", "18") //DefaultPostForm前端不传参数，后端可以默认输出指定的参数

	Hobby := ctx.PostFormArray("Hobbies") //前端以数组的形式传递参数

	user := ctx.PostFormMap("user") //前端以map的形式传递参数

	fmt.Println(username)
	fmt.Println(password)
	fmt.Println(age)
	fmt.Println(Hobby)
	fmt.Println(user)
	ctx.String(http.StatusOK, "默认年龄为18 成功")
}

func ToUserAdd4(ctx *gin.Context) {
	ctx.HTML(200, "to_user_add4.html", nil)
}

func DoUserAdd4(ctx *gin.Context) {
	var user_info UserInfo

	err := ctx.ShouldBind(&user_info)
	fmt.Println(err)
	fmt.Println(user_info)
	ctx.String(http.StatusOK, "绑定成功-->")
}
